﻿using System;
using System.Collections.Generic;
using ZyGames.DZPocker.Model;
using ZyGames.Framework.Cache.Generic;
using ZyGames.Framework.Game.Cache;
using ZyGames.Framework.Game.Context;
using ZyGames.Framework.Game.Contract;
using ZyGames.Framework.Game.Contract.Action;
using ZyGames.Framework.Game.Lang;
using ZyGames.Framework.Game.Service;
using System.Linq;
using ZyGames.DZPocker.Bll.Logic;
using ZyGames.DZPocker.Script;
using ZyGames.Framework.Net;
using ZyGames.Framework.RPC.Sockets;
using ZyGames.DZPocker.Tools;

namespace ZyGames.DZPocker.Script.CsScript.Action
{
	/// <summary>
	/// 玩家选择座位
	/// (根据客户端提交的桌子号，座位号，UserID来判断当期位置是否有人，如果有人则返回当前玩家ID，如果没有人的话则坐下位置,并且给他发放当前房间的筹码)
	/// TODO：要判断游戏房间是否在Playing状态，如果是则开局，如果不是则不响应
	/// 根据玩家Property.Ready 是否为true 如果是false的话说明没有坐下过，那么直接可以坐下并且有出是筹码，如果是true的话，说明是第二次坐下，如果当前chip是0的话，则不可以坐下，必须要先申请筹码
	/// </summary>
	public class Action30000 : BaseAction
	{
		private int _userId;
		private int _tableId;
		private int _posId;   //(1-9)
		//返回结果，判断当前位置是否有人
		private bool _result = false;
		private TableData _currentTable;
		private GameUser _currentGameUser;
		private PositionData _currentPos;
		//如果当前位置有人则人会当前位置玩家的ID号,如果没人的话就返回0
		private int _currentPosUserID = -1;
		/// <summary>
		/// 坐下的时候获得的筹码数量
		/// </summary>
		private int _chip;
		private string _log = "";

		public Action30000(HttpGet actionGetter)
			: base((short)ActionType.DZGameUserChooseSet, actionGetter)
		{
		}
		public override bool GetUrlElement()
		{
			if (httpGet.GetInt("TableID", ref _tableId) &&
				httpGet.GetInt("UserID", ref _userId) &&
				httpGet.GetInt("PosID", ref _posId))
			{
				return true;
			}
			return false;
		}

		public override bool TakeAction()
		{
			try
			{
				_currentTable = GameRoom.Current.GetTableData(_tableId);
				if (_currentTable == null)
				{
					Tool.WriteWarmingLine("消息30000获得房间不存在");
					return false;
				}
				if (_posId > _currentTable.PlayerNum)
				{
					Tool.WriteWarmingLine("消息30000座位号不合法");
					return false;
				}
				_currentPos = _currentTable.Positions[_posId - 1];
				if (_currentPos == null)
				{
					Tool.WriteWarmingLine("消息30000座位号不存在");
					return false;
				}
				_currentGameUser = GameTable.Current.GetUser(_userId);
				if (_currentGameUser == null)
				{
					Tool.WriteWarmingLine("消息30000玩家不存在");
					return false;
				}
				if (!_currentPos.IsEmpty)
				{
					Tool.WriteWarmingLine("消息30000当前位置已经有人");
					this._currentPosUserID = _currentPos.UserId;
				}
				else
				{
					//第一次坐下就有200筹码,然后要添加到实时记录里面
					//之前没有坐下过这个房间，并且成功参与到这一局且添加到实时战绩里面
					if (_currentTable.AddRealTimeRecord(_currentGameUser))
					{
						this._chip = _currentTable.Chip;
						_currentTable.AddRealTimeRecord(_userId, this._chip, this._chip);
					}
					else  //之前坐下过要判断记录里面是否有剩余筹码，如果有的话则可以坐下，如果没有则不可以坐下
					{
						var record = _currentTable.GetRealTimeRecord(_userId);
						if (record == null)
						{
							Tool.WriteErrorLine("当前记录不存在");
							return false;
						}
						if (record.LeftChip <= 0)
						{
							Tool.WriteWarmingLine(string.Format("桌子:{0} 玩家:{1} 座位:{2} 之前已经坐下过，并且没有筹码，不可以坐下，必须要先申请筹码", _tableId, _userId, _posId));
							//return false;
							_log = "请申请筹码";
							_result = false;
							return true;
						}
					}
					_currentPos.UserId = _userId;
					_currentGameUser.Property.SetTablePositionId(_tableId, _currentPos.Id);
					_currentGameUser.Property.AddTableID(_currentTable.TableId);
					if (_currentGameUser.GetUserId() == _currentTable.TableMaster.GetUserId())
					{
						Tool.WriteErrorLine("当前是房主坐下，直接设置状态为true");
						_currentGameUser.Property.SetReadyState(_tableId, true);
					}
				}
			}
			catch (Exception ex)
			{
				Tool.WriteErrorLine("30000消息异常:" + ex.ToString());
				return false;
			}
			_result = true;
			return true;
		}

		public override void TakeActionAffter(bool state)
		{
			if (_result && this._currentPosUserID == -1)
			{
				var parameters = new Parameters();
				parameters["TableID"] = _tableId;
				parameters["UserID"] = _userId;
				parameters["PosID"] = _posId;
				parameters["Chip"] = _chip;

				_currentTable.SitDown(_currentPos, _currentGameUser);
				//剩余的筹码都要加到当前座位上
				RealTimeRecord record = _currentTable.GetRealTimeRecord(_userId);
				if (record == null)
				{
					Tool.WriteErrorLine("消息3000当前记录不存在");
					return;
				}
				_currentPos.Chip += record.LeftChip;
				record.LeftChip = 0;

				GameTable.Current.SyncNotifyAction((int)ActionType.DZBrocastGameUserChooseSet, _currentTable, parameters, t =>
				{
					Console.WriteLine("Action 30001 广播玩家选择座位");
				});
				if (_currentTable.State == TableState.Waiting)
					//判断是否已经开局，没有开局则开局
					GameTable.Current.CheckStart(_currentTable);
			}
			base.TakeActionAffter(state);
		}

		public override void BuildPacket()
		{
			//如果返回的是0，则客户端认为可以坐下
			this.PushIntoStack(this._currentPosUserID);
			this.PushIntoStack(this._result);
			this.PushIntoStack(this._log);
		}
	}
}
